package wortubung.util;

import java.util.HashMap;

public class SgmlEntity {
	static HashMap<String,Integer> entityMap = null;
	
	private static void addToMap(String entity, int value) { entityMap.put(entity, value); }
	private static void init() {
		entityMap = new HashMap<String,Integer>();

		addToMap("&Aacute;",  193);	addToMap("&aacute;",   225);	addToMap("&Acirc;",   194);	addToMap("&acirc;",   226);
		addToMap("&acute;",   180);	addToMap("&AElig;",    198);	addToMap("&aelig;",   230);	addToMap("&Agrave;",  192);
		addToMap("&agrave;",  224);	addToMap("&alefsym;", 8501);	addToMap("&Alpha;",   913);	addToMap("&alpha;",   945);
		addToMap("&amp;",      38);	addToMap("&and;",     8743);	addToMap("&ang;",    8736);	addToMap("&Aring;",   197);
		addToMap("&aring;",   229);	addToMap("&asymp;",   8776);	addToMap("&Atilde;",  195);	addToMap("&atilde;",  227);
		addToMap("&Auml;",    196);	addToMap("&auml;",     228);	addToMap("&bdquo;",  8222);	addToMap("&Beta;",    914);
		addToMap("&beta;",    946);	addToMap("&brvbar;",   166);	addToMap("&bull;",   8226);	addToMap("&cap;",    8745);
		addToMap("&Ccedil;",  199);	addToMap("&ccedil;",   231);	addToMap("&cedil;",   184);	addToMap("&cent;",    162);
		addToMap("&Chi;",     935);	addToMap("&chi;",      967);	addToMap("&circ;",    710);	addToMap("&clubs;",  9827);
		addToMap("&cong;",   8773);	addToMap("&copy;",     169);	addToMap("&crarr;",  8629);	addToMap("&cup;",    8746);
		addToMap("&curren;",  164);	addToMap("&dagger;",  8224);	addToMap("&Dagger;", 8225);	addToMap("&darr;",   8595);
		addToMap("&dArr;",   8659);	addToMap("&deg;",      176);	addToMap("&Delta;",   916);	addToMap("&delta;",   948);
		addToMap("&diams;",  9830);	addToMap("&divide;",   247);	addToMap("&Eacute;",  201);	addToMap("&eacute;",  233);
		addToMap("&Ecirc;",  202);	addToMap("&ecirc;",    234);	addToMap("&Egrave;",  200);	addToMap("&egrave;",  232);
		addToMap("&empty;",  8709);	addToMap("&emsp;",    8195);	addToMap("&ensp;",   8194);	addToMap("&Epsilon;", 917);
		addToMap("&epsilon;", 949);	addToMap("&equiv;",   8801);	addToMap("&Eta;",     919);	addToMap("&eta;",     951);
		addToMap("&ETH;",     208);	addToMap("&eth;",      240);	addToMap("&Euml;",    203);	addToMap("&euml;",    235);
		addToMap("&euro;",   8364);	addToMap("&exist;",   8707);	addToMap("&fnof;",    402);	addToMap("&forall;", 8704);
		addToMap("&frac12;",  189);	addToMap("&frac14;",   188);	addToMap("&frac34;",  190);	addToMap("&frasl;",  8260);
		addToMap("&Gamma;",   915);	addToMap("&gamma;",    947);	addToMap("&ge;",     8805);	addToMap("&harr;",   8596);
		addToMap("&hArr;",   8660);	addToMap("&hearts;",  9829);	addToMap("&hellip;", 8230);	addToMap("&Iacute;",  205);
		addToMap("&iacute;",  237);	addToMap("&Icirc;",    206);	addToMap("&icirc;",   238);	addToMap("&iexcl;",   161);
		addToMap("&Igrave;",  204);	addToMap("&igrave;",   236);	addToMap("&image;",  8465);	addToMap("&infin;",  8734);
		addToMap("&int;",    8747);	addToMap("&Iota;",     921);	addToMap("&iota;",    953);	addToMap("&iquest;",  191);
		addToMap("&isin;",   8712);	addToMap("&Iuml;",     207);	addToMap("&iuml;",    239);	addToMap("&Kappa;",   922);
		addToMap("&kappa;",   954);	addToMap("&Lambda;",   923);	addToMap("&lambda;",  955);	addToMap("&lang;",   9001);
		addToMap("&laquo;",   171);	addToMap("&larr;",    8592);	addToMap("&lArr;",   8656);	addToMap("&lceil;",  8968);
		addToMap("&ldquo;",  8220);	addToMap("&le;",      8804);	addToMap("&lfloor;", 8970);	addToMap("&lowast;", 8727);
		addToMap("&loz;",    9674);	addToMap("&lrm;",     8206);	addToMap("&lsaquo;", 8249);	addToMap("&lsquo;",  8216);
		addToMap("&macr;",    175);	addToMap("&mdash;",   8212);	addToMap("&micro;",   181);	addToMap("&middot;",  183);
		addToMap("&minus;",  8722);	addToMap("&Mu;",       924);	addToMap("&mu;",      956);	addToMap("&nabla;",  8711);
		addToMap("&nbsp;",    160);	addToMap("&ndash;",   8211);	addToMap("&ne;",     8800);	addToMap("&ni;",     8715);
		addToMap("&not;",     172);	addToMap("&notin;",   8713);	addToMap("&nsub;",   8836);	addToMap("&Ntilde;",  209);
		addToMap("&ntilde;",  241);	addToMap("&Nu;",       925);	addToMap("&nu;",      957);	addToMap("&Oacute;",  211);
		addToMap("&oacute;",  243);	addToMap("&Ocirc;",    212);	addToMap("&ocirc;",   244);	addToMap("&OElig;",   338);
		addToMap("&oelig;",   339);	addToMap("&Ograve;",   210);	addToMap("&ograve;",  242);	addToMap("&oline;",  8254);
		addToMap("&Omega;",   937);	addToMap("&omega;",    969);	addToMap("&Omicron;", 927);	addToMap("&omicron;", 959);
		addToMap("&oplus;",  8853);	addToMap("&or;",      8744);	addToMap("&ordf;",    170);	addToMap("&ordm;",    186);
		addToMap("&Oslash;",  216);	addToMap("&oslash;",   248);	addToMap("&Otilde;",  213);	addToMap("&otilde;",  245);
		addToMap("&otimes;", 8855);	addToMap("&Ouml;",     214);	addToMap("&ouml;",    246);	addToMap("&para;",    182);
		addToMap("&part;",   8706);	addToMap("&permil;",  8240);	addToMap("&perp;",   8869);	addToMap("&Phi;",     934);
		addToMap("&phi;",     966);	addToMap("&Pi;",       928);	addToMap("&pi;",      960);	addToMap("&piv;",     982);
		addToMap("&plusmn;",  177);	addToMap("&pound;",    163);	addToMap("&prime;",  8242);	addToMap("&Prime;",  8243);
		addToMap("&prod;",   8719);	addToMap("&prop;",    8733);	addToMap("&Psi;",     936);	addToMap("&psi;",     968);
		addToMap("&quot;",     34);	addToMap("&radic;",   8730);	addToMap("&rang;",   9002);	addToMap("&raquo;",   187);
		addToMap("&rarr;",   8594);	addToMap("&rArr;",    8658);	addToMap("&rceil;",  8969);	addToMap("&rdquo;",  8221);
		addToMap("&real;",   8476);	addToMap("&reg;",      174);	addToMap("&rfloor;", 8971);	addToMap("&Rho;",     929);
		addToMap("&rho;",     961);	addToMap("&rlm;",     8207);	addToMap("&rsaquo;", 8250);	addToMap("&rsquo;",  8217);
		addToMap("&sbquo;",  8218);	addToMap("&Scaron;",   352);	addToMap("&scaron;",  353);	addToMap("&sdot;",   8901);
		addToMap("&sect;",    167);	addToMap("&shy;",      173);	addToMap("&Sigma;",   931);	addToMap("&sigma;",   963);
		addToMap("&sigmaf;",  962);	addToMap("&sim;",     8764);	addToMap("&spades;", 9824);	addToMap("&sub;",    8834);
		addToMap("&sube;",   8838);	addToMap("&sum;",     8721);	addToMap("&sup1;",    185);	addToMap("&sup2;",    178);
		addToMap("&sup3;",    179);	addToMap("&sup;",     8835);	addToMap("&supe;",   8839);	addToMap("&szlig;",   223);
		addToMap("&Tau;",     932);	addToMap("&tau;",      964);	addToMap("&there4;", 8756);	addToMap("&Theta;",   920);
		addToMap("&theta;",   952);	addToMap("&thetasym;", 977);	addToMap("&thinsp;", 8201);	addToMap("&THORN;",   222);
		addToMap("&thorn;",   254);	addToMap("&tilde;",    732);	addToMap("&times;",   215);	addToMap("&trade;",  8482);
		addToMap("&Uacute;",  218);	addToMap("&uacute;",   250);	addToMap("&uarr;",   8593);	addToMap("&uArr;",   8657);
		addToMap("&Ucirc;",   219);	addToMap("&ucirc;",    251);	addToMap("&Ugrave;",  217);	addToMap("&ugrave;",  249);
		addToMap("&uml;",     168);	addToMap("&upsih;",    978);	addToMap("&Upsilon;", 933);	addToMap("&upsilon;", 965);
		addToMap("&Uuml;",    220);	addToMap("&uuml;",     252);	addToMap("&weierp;", 8472);	addToMap("&Xi;",      926);
		addToMap("&xi;",      958);	addToMap("&Yacute;",   221);	addToMap("&yacute;",  253);	addToMap("&yen;",     165);
		addToMap("&yuml;",    255);	addToMap("&Yuml;",     376);	addToMap("&Zeta;",    918);	addToMap("&zeta;",    950);
		addToMap("&zwj;",    8205);	addToMap("&zwnj;",    8204);
	}

    public static String unescapeSgmlEntity(String str) {
        
        //initialize html translation maps table the first time is called
        if (entityMap == null)
        	init();
        
        StringBuffer buf = new StringBuffer();
        for (int i=0; i<str.length(); ++i) {
            char ch = str.charAt(i);
            if (ch != '&') {
            	buf.append(ch);
            	continue;
            }
            int semi = str.indexOf(';', i+1);
            if ((semi < 0) || ((semi-i) > 7)){
                buf.append(ch);
                continue;
            }
            String entity = str.substring(i, semi+1);
            if (entity.charAt(1) == ' ') {
                buf.append(ch);
                continue;
            }

            int iso;
            if (entity.charAt(1) == '#') {
                if (entity.charAt(2) == 'x')
                	iso = Integer.parseInt(entity.substring(3, entity.length()-1), 16);
                else
                	iso = Integer.parseInt(entity.substring(2, entity.length()-1));
            } else {
            	iso = entityMap.get(entity);
            }
            if (iso == -1)
            	buf.append(entity);
            else
            	buf.append((char)iso);
            i = semi;
        }
	    return buf.toString();
	}

}
